/* 
基础数据类型
1. boolean
2. number
3. string
4. null和undefined
5. 数组
6. 元组(Tuple) 
7. 枚举(enum)
8. any
9. void
10. object
*/

(function () {
  
  // 1. boolean
  let isDone: boolean = false
  isDone = true
  // isDone = 0  // error

  // 2. number
  let age: number = 3
  age = -1.2
  // age = 'abc'  // error

  // 3. string
  let name: string = 'abc'
  name = ''
  // name = {}  // error

  // 4. null和undefined  ==> null类型与undefined类型是任意其它类型的子类型
  let n: null = null
  // n = 'abc' // error
  let u: undefined = undefined
  // u = 123 // error
  name = null
  name = undefined

  // 5. 数组
  let names: string[] = ['abc', 'aaa'/* , true */]
  let names2: Array<string> = ['sss', 'aaa'/* , 32 */]

  // 6. 元组(Tuple) 特别的数组(元素的个数和类型都是固定的)
  let nameAge: [string, number]
  nameAge = ['tom', 12]

  // 7. 枚举(enum)
  enum Color {
    Red,
    Green = 2,
    Blue
  }

  console.log(Color)
  let myColor: Color = Color.Green
  
  const cat = {
    name: 'kk',
    color: 2
  }

  switch (cat.color) {
    case Color.Red:
      console.log('你的猫是红色')
      break;
    case Color.Green:
      console.log('你的猫是绿色')
      break;
    case Color.Blue:
      console.log('你的猫是蓝色')
      break;
    default:
      break;
  }


  // 8. any
  let arr3: any[] = ['abc', 123]
  let a: any = 3
  a = 'abc'

  // 9. void ==> 标识函数没有返回值
  function fn(): boolean {
    return true
  }
  function fn2(): void {
    // return 2 // error
    // return undefined
    // return null
  }


  // 10. object 
  function fn3(obj: object): object {
    // return {}
    // return () => {}
    // return []
    // return 3  // error
    // return null
    return undefined
  }

  fn3({})
  
})()

/* 

js 弱类型   声明变量不能指定类型
ts 强类型   声明变量时可以指定类型
强类型的好处:
  正确语法的提示补全  
  错误语法的错误提示
*/